package controllcivil.bean;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import controllcivil.variaveis.EnumTipoEstagioObra;

/**
 * Entidade que representa o estagio de um obra. <br />
 * - FUNDACAO - ALVENARIA - ACABAMENTO
 * 
 * @author Rafael Altagnam
 * 
 */
@Table(name = "ESTAGIO_OBRA")
@javax.persistence.Entity
public class EstagioObra extends Entity implements Serializable{

	private static final long serialVersionUID = 1L;

	/**
	 * Variavel que representa a obra.
	 */
	@ManyToOne (cascade = CascadeType.ALL)
	@JoinColumn(name = "ID_OBRA")
	private Obra obra;

	
	
	/**
	 * Variavel que representa a data de inicio do estagio.
	 */
	@Temporal(TemporalType.DATE)
	@Column(name = "data_inicio")
	private Calendar dataInicio;

	
	
	/**
	 * Variavel que representa a data de termino do estagio.
	 */
	@Temporal(TemporalType.DATE)
	@Column(name = "data_termino")
	private Calendar dataTermino;

	
	
	private EnumTipoEstagioObra estagio;

	
	
	/**
	 * Variavel que representa se o estagio esta ativo ou nao.
	 */
	private boolean ativo;

	
	
	/**
	 * Variavel que representa a porcentagem de consumo monetariio do estagio
	 */
	@Column(name = "porc_cons_mon_obra")
	private double percentualConsumoMonetarioObra;

	
	
	/**
	 * Variavel indicando a porcentagem de conculusao da obra.
	 */
	@Column(name = "porc_conclusao")
	private double percentualConclusaoEstagio;

	
	
	/**
	 * Numero inteiro indicando qual o estagio esta selecionando.
	 */
	@javax.persistence.Transient
	private int estagioOrdinal;

	
	
	/**
	 * Variavel indicando o valor planejado. Calculada a partir do valor total
	 * previsto da obra "x" Percentual de Consumo "/" 100.
	 */
	private BigDecimal valorPlanejado;
	
	
	
	/**
	 *  Variavel indicando o valor agregado da obra.
	 */
	private BigDecimal valorAgregado;
	
	
	/**
	 * Variavel que representa o valor atual da obra.
	 */
	@Column(name = "valor_total")
	private BigDecimal valorTotal;

	
	
	/**
	 * Construtor do Estagio Obra
	 */
	public EstagioObra() {

	}	
	
	

	public void setValorAgregado(BigDecimal valorAgregado) {
		this.valorAgregado = valorAgregado;
	}
	
	public double getPercentualConclusaoEstagio() {
		return percentualConclusaoEstagio;
	}

	public void setPercentualConclusaoEstagio(double percentualConclusaoEstagio) {
		this.percentualConclusaoEstagio = percentualConclusaoEstagio;
	}

	public double getPercentualConsumoMonetarioObra() {
		return percentualConsumoMonetarioObra;
	}

	public void setPercentualConsumoMonetarioObra(
			double percentualConsumoMonetarioObra) {
		this.percentualConsumoMonetarioObra = percentualConsumoMonetarioObra;
	}

	public Obra getObra() {
		return obra;
	}

	public void setObra(Obra obra) {
		this.obra = obra;
	}

	public BigDecimal getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(BigDecimal valorTotal) {
		this.valorTotal = valorTotal;
	}

	public EnumTipoEstagioObra getEstagio() {
		return estagio;
	}

	public void setEstagio(EnumTipoEstagioObra estagio) {
		this.estagio = estagio;
	}

	public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	public int getEstagioOrdinal() {
		this.estagioOrdinal = estagio.ordinal();
		return estagioOrdinal;
	}

	public void setEstagioOrdinal(int estagioOrdinal) {
		this.estagioOrdinal = estagioOrdinal;
	}

	public Calendar getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Calendar dataInicio) {
		this.dataInicio = dataInicio;
	}

	public Calendar getDataTermino() {
		return dataTermino;
	}

	public void setDataTermino(Calendar dataTermino) {
		this.dataTermino = dataTermino;
	}

	public BigDecimal getValorPlanejado() {
		return valorPlanejado;
	}

	public void setValorPlanejado(BigDecimal valorPlanejado) {
		this.valorPlanejado = valorPlanejado;
	}

	public BigDecimal getValorAgregado() {
		return valorAgregado;
	}



	@Override
	public String toString() {
		return "EstagioObra [id = " + id + " obra=" + obra + ", estagio=" + estagio + "]";
	}



	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (ativo ? 1231 : 1237);
		result = prime * result
				+ ((dataInicio == null) ? 0 : dataInicio.hashCode());
		result = prime * result
				+ ((dataTermino == null) ? 0 : dataTermino.hashCode());
		result = prime * result + ((estagio == null) ? 0 : estagio.hashCode());
		result = prime * result + estagioOrdinal;
		result = prime * result + ((obra == null) ? 0 : obra.hashCode());
		long temp;
		temp = Double.doubleToLongBits(percentualConclusaoEstagio);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits(percentualConsumoMonetarioObra);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result
				+ ((valorAgregado == null) ? 0 : valorAgregado.hashCode());
		result = prime * result
				+ ((valorPlanejado == null) ? 0 : valorPlanejado.hashCode());
		result = prime * result
				+ ((valorTotal == null) ? 0 : valorTotal.hashCode());
		return result;
	}



	@Override
	public boolean equals(Object obj) {
		
		EstagioObra other = (EstagioObra) obj;
		if (this == obj)
			return true;
		
		if (obj == null)
			return false;
		
		if (getClass() != obj.getClass())
			return false;
		
		if (other.id == this.id)
			return true;

		return false;
	}	

}
